package com.反射Reflection.Class类;

import java.lang.reflect.Field;

public class GetClass的6种方式 {
    public static void main(String[] args) throws ClassNotFoundException {
        String classAllPath = "com.反射Reflection.Class类.Cat";

        /// 1.通过读取配置文件来反射获取
        Class<?> cls1 = Class.forName(classAllPath);
        System.out.println(cls1);

        /// 2.类名.class 得到Class类对象；
        ///多用于参数传递，比如反射用构造器创建对象时，得到构造器时如果有(比如String)参数，就可以传入String.class 得到形参为String的构造器；
        Class<Cat> cls2 = Cat.class;
        System.out.println(cls2);

        ///3.对象.getClass(); 通过创建好的对象来得到对应的Class类对象
        Cat cat = new Cat();
        Class cls3 = cat.getClass();
        System.out.println(cls3);

        /// 4.通过类加载器来获取Class对象；
        /// 1.先得到对象得到Class类，在得到类加载器；
        ClassLoader classLoader = cat.getClass().getClassLoader();
        /// 2.通过类加载器得到Class类
        Class<?> cls4 = classLoader.loadClass(classAllPath);
        System.out.println(cls4);

        System.out.println(cls1.hashCode());
        System.out.println(cls2.hashCode());
        System.out.println(cls3.hashCode());
        System.out.println(cls4.hashCode());
        /**四种方式得到的同一个类的Class对象都是一样的，因为同一个类只会加载一次，只会创建一个Class类
         * class com.反射Reflection.Class类.Cat
         * class com.反射Reflection.Class类.Cat
         * class com.反射Reflection.Class类.Cat
         * class com.反射Reflection.Class类.Cat
         * 666641942
         * 666641942
         * 666641942
         * 666641942
         */
        System.out.println("=================");
        /// 5.基本数据类型.class 来得到Class对象
        Class<Integer> cls5 = int.class;
        System.out.println(cls5);
        /// 6.通过包装类.TYPE来得到Class对象
        Class<Integer> cls6 = Integer.TYPE;
        System.out.println(cls6);

        System.out.println(cls5.hashCode());
        System.out.println(cls6.hashCode());
        /**这两种方式得到的Class类对象一样的；因为int和Integer会自动装箱拆箱，本质上是一致；
         * int  Class类对象
         * int
         * 356573597
         * 356573597
         */


    }

}
